package com.mrx.xfriendship.service;

import com.mrx.xfriendship.model.bo.RecoveryBO;
import com.mrx.xfriendship.model.dto.*;
import com.mrx.xfriendship.model.vo.*;
import org.springframework.lang.NonNull;

/**
 * 用户相关服务接口
 *
 * @author : 肖康宁
 * @since : 2022-12-09 10:17
 **/
public interface IUserService {

    /**
     * 通过 用户名 查询用户<br/>
     * 如果查不到需要抛出异常
     *
     * @param name 用户名
     */
    @NonNull
    SecurityUserDTO loadSecurityUserByName(String name);

    UserDTO selectUserByName(@NonNull String name);

    /**
     * 登录, 成功返回 登录成功的用户, 失败会抛出异常
     *
     * @param t       验证码的 key
     * @param captcha 验证码内容
     * @param userVO  要登录的用户对象
     * @return token
     */
    UserDTO login(String t, String captcha, LoginUserVO userVO);

    void logout(String userName);

    /**
     * 注册, 失败会抛出异常
     *
     * @param t       验证码的 key
     * @param captcha 验证码内容
     * @param ip      用户 ip
     * @param userVO  要注册的用户对象
     */
    void register(String t, String captcha, String ip, RegisterUserVO userVO);

    UserInfoDTO userInfo(Integer userId);

    String updateAvatar(Integer userId, String bucketFileName);

    void updateInfo(Integer userId, UserInfoVO info);

    void updatePassword(Integer userId, UserInfoVO info);

    UserDTO verify2faCode(String userName, String code);

    String req2faCode(String userName, Integer userId);

    String getAvatar(Integer id);

    void signing(Integer id);

    PageDTO<UserManagerDTO> listUsers(UserManagerPageVO vo);

    void updateUser(UpdateUserVO vo);

    void deleteUser(Integer id);

    String updatePhotoWall(Integer currentUserId, String upload);

    void deletePhotoWall(Integer currentUserId, Integer photoId);

    void updatePhotoDesc(Integer currentUserId, PhotoWallVO vo);

    void heartbeat(Integer currentUserId);

    Integer onlineUserNumber();

    Integer maxOnlineUserNumber();

    void syncMaxOnLineUserNumber(Integer onlineUserNumber);

    PageDTO<ScoreRankDTO> scoreRank(PageVO pageVO);

    ScoreRankDTO myScoreRank(Integer userId);

    PageDTO<PostRankDTO> postRank(PageVO pageVO);

    PostRankDTO myPostRank(Integer userId);

    void bindMail(String userName, String code);

    void recovery(RecoveryBO vo);
}
